package com.Volatile;

import java.util.concurrent.atomic.AtomicInteger;

public class NonAtomic {

    //解决非原子性的办法，使用 cas 或者 synchronized
    private volatile int count = 0;

    private AtomicInteger atomCount;

    public NonAtomic(){

        atomCount = new AtomicInteger();
    }

    public void addOne(){

        /**
         * 这里的 ++ 分三步
         * 1. 获取主内存的值
         * 2. 在工作内存中把值加
         *
         * 3. 写回主内存中
         * 不能保证原子性就是在写到主内存中的数据，被其他线程的写入数据覆盖了。
         */
        count++;
        atomCount.getAndIncrement();
    }

    public static void main(String[] args) {



        NonAtomic nonAtomic = new NonAtomic();
        for (int i = 0; i < 20; i++) {

            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                    nonAtomic.addOne();
                }
            },"线程"+String.valueOf(i)).start();
        }

        while (Thread.activeCount() > 2){

            System.out.println(Thread.currentThread());
//             yield 调用线程让出cpu，让其他线程和自己重新抢占cpu
            Thread.yield();
        }

        Thread.currentThread().getThreadGroup().list();

        System.out.println("last count value =" + nonAtomic.count);
        System.out.println("last count value =" + nonAtomic.atomCount.get());
    }

}
